001 /* EVolve - an Extensible Software Visualization Framework
002 * Copyright (C) 2001-2002 Qin Wang
003 *
004 * This library is free software; you can redistribute it and/or
005 * modify it under the terms of the GNU Library General Public
006 * License as published by the Free Software Foundation; either
007 * version 2 of the License, or (at your option) any later version.
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Library General Public License for more details.
013 *
014 * You should have received a copy of the GNU Library General Public
015 * License along with this library; if not, write to the
016 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
017 * Boston, MA 02111-1307, USA.
018 */
019
020 /*
021 * EVolve is distributed at http://www.sable.mcgill.ca/EVolve/
022 */
023
024 package EVolve.data;
025
026 import EVolve.*;
027 import java.awt.*;
028 import java.util.*;
029 import java.util.regex.*;
030
031 public class Selection implements Cloneable{
032 private String name;
033 private int sourceType, entityType;
034 private Entity[] selected;
035 private long start, end;
036 private ReferenceLink[] link;
037 private Color color;
038 private static int total = 0;
039 private long startTime = -1, endTime = -1;
040 private ArrayList timeMap;
041
042 public Selection(int sourceType, int entityType, long[] selected, long start, long end, ArrayList timemap) {
043 this.entityType = entityType;
044 this.sourceType = sourceType;
045 this.selected = new Entity[selected.length];
046 for (int i = 0; i < selected.length; i++) {
047 this.selected[i] = (Entity)Scene.getDataManager().getEntity()[entityType].get(new Long(selected[i]));
048 }
049 this.start = start;
050 this.end = end;
051 this.color = null;
052 this.link = new ReferenceLink[0];
053
054 this.name = "Selection" + total;
055 total++;
056 timeMap = new ArrayList();
057 if (timemap != null) {
058 for (int i=0; i<timemap.size(); i++) {
059 long[] newValue = new long[2];
060 long[] oldValue = (long[])timemap.get(i);
061 newValue[0] = oldValue[0];
062 newValue[1] = oldValue[1];
063 timeMap.add(newValue);
064 }
065 findTimeInterval(start, end);
066 }
067 }
068
069 public void setName(String name) {
070 this.name = name;
071 }
072
073 public String getName() {
074 return name;
075 }
076
077 public void setColor(Color color) {
078 this.color = color;
079 }
080
081 public Color getColor() {
082 return color;
083 }
084
085 public void setLink(ReferenceLink[] link) {
086 this.link = link;
087 }
088
089 public ReferenceLink[] getLink() {
090 return link;
091 }
092
093 public int getEntityType() {
094 return entityType;
095 }
096
097 public Entity[] getSelected() {
098 return selected;
099 }
100
101 public void setSelected(Entity[] selected) {
102 this.selected = selected;
103 }
104
105 public long getStart() {
106 return start;
107 }
108
109 public long getEnd() {
110 return end;
111 }
112
113 public long getStartTime() {
114 return startTime;
115 }
116
117 public long getEndTime() {
118 return endTime;
119 }
120
121 public void setStartEvent(int start) {
122 startTime = start;
123 }
124
125 public void setEndEvent(int end) {
126 endTime = end;
127 }
128
129 public void setTimeInterval(long startTime, long endTime) {
130 this.startTime = startTime;
131 this.endTime = endTime;
132 findEventInterval();
133 }
134
135 public Selection specialClone() {
136 long ids[] = new long[selected.length];
137
138 for (int i=0; i<ids.length; i++) {
139 ids[i] = selected[i].getId();
140 }
141
142 //Selection returnVal = new Selection(entityType,ids,0,Integer.MAX_VALUE,-1,-1,null);
143 Selection returnVal = new Selection(sourceType,entityType,ids,0,Long.MAX_VALUE,null);
144 returnVal.setColor(color);
145 returnVal.setName(name);
146 returnVal.setLink(link);
147
148 return returnVal;
149 }
150
151 public ArrayList getTimeMap() {
152 return timeMap;
153 }
154
155 public Object clone() {
156 Selection o = null;
157
158 try {
159 o = (Selection)super.clone();
160 } catch (CloneNotSupportedException e) {
161 System.out.println("Clone not supported in selection");
162 return o;
163 }
164
165 o.name = name;
166 o.selected = new Entity[selected.length];
167 for (int i=0; i<selected.length; i++) {
168 o.selected[i] = selected[i];
169 }
170 o.link = new ReferenceLink[link.length];
171 for (int i=0; i<link.length; i++) {
172 o.link[i] = (ReferenceLink)link[i].clone();
173 }
174 o.color = color == null ? null : new Color(color.getRGB());
175 return o;
176 }
177
178 private void findTimeInterval(long start, long end) {
179 int found = 0;
180 if (timeMap != null) {
181 for (int i = 0; i< timeMap.size(); i++) {
182 long[] map = (long[])timeMap.get(i);
183 if ((startTime == -1) && (map[1] == start)) {
184 startTime = map[0];
185 found++;
186 }
187 if (map[1] == end) {
188 endTime = map[0];
189 found++;
190 }
191 if (found == 2) {
192 if (endTime == -1) endTime = Integer.MAX_VALUE;
193 return;
194 }
195 }
196 }
197 }
198
199 private void findEventInterval() {
200 long time[] = new long[2], event[] = new long[2];
201 time[0] = startTime;
202 time[1] = endTime;
203 event[0] = 0;
204 event[1] = Long.MAX_VALUE;
205
206 if (timeMap != null) {
207 for (int i=0; i<time.length; i++) {
208 long lastTarget = -1;
209 for (int j = 0; j< timeMap.size(); j++) {
210 long[] map = (long[])timeMap.get(j);
211 if ((lastTarget<= time[i])&&(map[0]>=time[i])) {
212 event[i] = map[1];
213 break;
214 }
215 }
216 }
217 start = event[0];
218 end = event[1];
219 }
220 }
221
222 public void changeTimeFrame(long startTime, long endTime) {
223 setTimeInterval(startTime, endTime);
224 findEventInterval();
225 }
226
227 public int getSourceType() {
228 return sourceType;
229 }
230
231 public void filterEntities(String regExps, boolean keepMatched) {
232 HashSet result = new HashSet();
233
234 StringTokenizer token = new StringTokenizer(regExps,";");
235 while (token.hasMoreTokens()) {
236 String regExp = token.nextToken();
237 Pattern pattern = Pattern.compile(regExp);
238 Matcher matcher = pattern.matcher("");
239
240 for (int i=0; i<selected.length; i++) {
241 String entityName = selected[i].getName().replace('.','/');
242 matcher.reset(entityName);
243
244 if ((matcher.find() == keepMatched)&&(!result.contains(new Integer(i)))) {
245 result.add(new Integer(i));
246 }
247 }
248 }
249
250 Entity[] newSelected = new Entity[result.size()];
251 int i = 0;
252 for (int j=0; j<selected.length; j++) {
253 if (result.contains(new Integer(j)))
254 newSelected[i++] = selected[j];
255 }
256 selected = null;
257 selected = newSelected;
258 }
259 }